package com.learning_paicoding.utils;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 统一API响应结果封装
 * @param <T> 数据类型
 *
 * @Author hph
 * @Date 2025/07/06 21:00
 **/
@Data
@Accessors(chain = true)
public class Result<T> {

    // 状态码（推荐使用HTTP状态码）
    private int code;

    // 业务状态码（可选，用于更细粒度的状态控制）
    private String subCode;

    // 提示信息
    private String message;

    // 返回数据
    private T data;

    // 时间戳
    private long timestamp = System.currentTimeMillis();

    // 成功响应（无数据）
    public static <T> Result<T> success() {
        return success(null);
    }


    // 成功响应（带数据）
    public static <T> Result<T> success(String message,T data) {
        return new Result<T>()
                .setCode(200)
                .setMessage(message)
                .setData(data);
    }

    // 成功响应（无数据）
    public static <T> Result<T> success(String message) {
        return new Result<T>()
                .setCode(200)
                .setMessage(message);
    }

    // 失败响应（通用）
    public static <T> Result<T> fail(int code, String message) {
        return new Result<T>()
                .setCode(code)
                .setMessage(message);
    }

    // 客户端错误（400系列）
    public static <T> Result<T> clientError(String message) {
        return fail(400, message);
    }

    // 未授权错误（401）
    public static <T> Result<T> unauthorized() {
        return fail(401, "未授权或登录已过期");
    }

    // 禁止访问（403）
    public static <T> Result<T> forbidden() {
        return fail(403, "权限不足");
    }

    // 资源不存在（404）
    public static <T> Result<T> notFound() {
        return fail(404, "资源不存在");
    }

    // 服务器错误（500系列）
    public static <T> Result<T> serverError(String message) {
        return fail(500, message);
    }

    // 业务逻辑错误（可选）
    public static <T> Result<T> businessError(String subCode, String message) {
        return new Result<T>()
                .setCode(400)
                .setSubCode(subCode)
                .setMessage(message);
    }



}
